package com.mingqi.hw.test3140;

import java.util.Scanner;
/**
 * 程序员小明打了一辆出租车去上班。出于职业敏感，他注意到这辆出租车的计费表有点问题，总是偏大。
 * 出租车司机解释说他不喜欢数字4，所以改装了计费表，任何数字位置遇到数字4就直接跳过，其余功能都正常。
 * 比如：
 * 23再多一块钱就变为25；
 * 39再多一块钱变为50；
 * 399再多一块钱变为500；
 * 小明识破了司机的伎俩，准备利用自己的学识打败司机的阴谋。
 * 给出计费表的表面读数，返回实际产生的费用。
 * 输入描述:
 * 只有一行，数字N，表示里程表的读数。
 * (1<=N<=888888888)。
 * 输出描述:
 * 一个数字，表示实际产生的费用。以回车结束。
 * 示例1：
 * 输入
 * 5
 * 输出
 * 4
 * 说明
 * 5表示计费表的表面读数。
 * 4表示实际产生的费用其实只有4块钱。
 * 示例2：
 * 输入
 * 17
 * 输出
 * 15
 * 说明
 * 17表示计费表的表面读数。
 * 15表示实际产生的费用其实只有15块钱。
 * 示例3：
 * 输入
 * 100
 * 输出
 * 81
 * 说明
 * 100表示计费表的表面读数。
 * 81表示实际产生的费用其实只有81块钱。
 *
 */
public class ZT31 {
    //出租车司机解释说他不喜欢数字4，所以改装了计费表，任何数字位置遇到数字4就直接跳过，其余功能都正常。
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            int input = in.nextInt();
            //求司机多算了多少[0,10][10,100][100,1000]
            int temp = 0;
            int total = input;
            int k = 0;//记录当前位
            int j = 1;//记录个位 十位 ？
            //13   1000
            /**
             * 题目大意】给定一个数n，求1~n内4的个数，然后这个数减去4的个数即可。
             *
             * 4的个数：
             *
             * 10以内：1 个
             * 100以内：1*9+10=19个（9个1-10范围内含4的数，也即{4,14,24,34,54,64,74,84,94}再加上{40~49}）
             * 1000以内：19*9+100=271个（9个1-100范围内含4的数，再加上{400~499}集合内的100个数）
             * 10000以内：271*9+1000=3439个（9个1-1000范围内含4的数，再加上{4000~4999}集合内的1000个数）
             *
             */
            while (total > 0) {
                if (total % 10 > 4) {//当前位大于4
                    temp += (total % 10 - 1) * k + j;
                } else {//当前位小于4                //0    100   0
                    temp += (total % 10) * k;      //0     0    0
                }
                k = k * 9 + j;  // 1    19    19*9+100 =271   4的个数
                j *= 10;          //10  100     1000
                total = total / 10; // 100  10   1
            }
            System.out.println(input - temp);
        }
    }
}

